use std::collections::HashMap;

fn main() {
    // 向量
    // 特点：向量不限长，但必须是同类型

    // 创建方式一，只能创建空向量，并且要标注类型
    let v: Vec<i32> = Vec::new();
    println!("vec: {:?}", v);

    //  创建方式二，可以写入初始数据
    let v = vec![1, 2, 3, 4];
    println!("vec: {:?}", v);

    // push方法，用来对向量进行添加值
    let mut v: Vec<i32> = Vec::new();
    println!("vec: {:?}", v);
    v.push(1);
    println!("vec: {:?}", v);

    // pop方法，弹出最后一个值，返回Option<T>类型数据
    let mut v = vec![1, 3, 5, 7, 9];
    let value = v.pop();
    println!("value: {}", value.unwrap_or(0));

    // get方法，取指定索引位的值的引用，返回Option<T>类型数据，超出了索引边界，不会导致系统奔溃
    let v = vec![1, 3, 5, 7, 9];
    let value = v.get(1);
    println!("value: {}", value.unwrap_or(&0));
    let value = v.get(10);
    println!("value: {}", value.unwrap_or(&0));

    // index取值，直接返回值，超出了索引边界，会导致系统奔溃
    let v = vec![1, 3, 5, 7, 9];
    let value = v[1];
    println!("value: {}", value);
    // let value = v[10];
    // println!("value: {}", value);

    // 向量扩容机制
    // let mut v = vec![2, 4, 6, 8];
    // let frist = &v[0];
    // v.push(10);
    // println!("frist: {}", frist);

    // 哈希字典
    // 特点：key和value各自下类型必须一样

    // 创建方式一，创建一个空哈希字典，必须标准类型
    let map: HashMap<&str, i32> = HashMap::new();
    println!("{:?}", map);

    // 创建方式二，可以写入初始数据
    let map = HashMap::from([("k1", 1), ("k2", 2)]);
    println!("{:?}", map);

    // insert方法
    let mut map: HashMap<&str, i32> = HashMap::new();
    println!("{:?}", map);
    map.insert("k1", 1);
    println!("{:?}", map);

    // get方法，获取指定key的值，返回Option<T>类型数据
    let map = HashMap::from([("k1", 1), ("k2", 2)]);
    let value = map.get("k2");
    println!("value: {:?}", value.unwrap_or(&0));

    // entry方法，用来判断是否指定key的值，or_insert方法在没有指定值，就会插入并返回可变引用
    let mut map = HashMap::from([("k1", 1), ("k2", 2)]);
    let b1 = map.entry("k1").or_insert(3);
    println!("b1: {:?}", b1);
    let b2 = map.entry("k3").or_insert(3);
    println!("b2: {:?}", b2);

    // 遍历
    let map = HashMap::from([("k1", 1), ("k2", 2), ("k3", 3)]);
    for (key, value) in map {
        println!("key: {} value: {}", key, value);
    }
}
